/**
 * Created by Administrator on 14-4-29.
 */

var http = require('http');


/**
 * 创建服务器的两种写法，第一种写法如下
 * 由于server已经继承了EventEmitter的事件功能，所以可以使用高级函数编写方式监控事件
 * @param {Function} request event
*/
var server = http.createServer(function(req,res)
{
    //这里的req为http.serverRequest
    console.log("建立了一个连接");
    res.writeHeader(200,{'Content-Type':'text/plain'});
    res.end('hello world');
    console.log("断开了一个连接");
});


/**
 * 说明：创建服务器的第二种写法
 * 有关server对象的事件监听
 * @param {Object} req 是http.IncomingMessag的一个实例，在keep-alive连接中支持多个请求
 * @param {Object} res 是http.ServerResponse的一个实例
 */
var server = new http.Server();
server.on('request',function(req,res){
    console.log("建立了一个连接");
    res.writeHeader(200,{'Content-Type':'text/plain'});
    res.end('hello world');
    console.log("断开了一个连接");
});

/**
 * 说明：新的TCP流建立时出发。 socket是一个net.Socket对象。 通常用户无需处理该事件。
 * 特别注意，协议解析器绑定套接字时采用的方式使套接字不会出发readable事件。 还可以通过request.connection访问socket。
 * @param {Object} socket
 */
server.on('connection',function(socket){});

/**
 * 源API: Event: 'close'
 * 说明：关闭服务器时触发
 */
server.on('close',function(){});

/**
 * 说明：每当收到Expect: 100-continue的http请求时触发。 如果未监听该事件，服务器会酌情自动发送100 Continue响应。
 * 处理该事件时，如果客户端可以继续发送请求主体则调用response.writeContinue， 如果不能则生成合适的HTTP响应（例如，400 请求无效）
 * 需要注意到, 当这个事件触发并且被处理后, request 事件将不再会触发.
 * @param {Object} req
 * @param {Object} req
 */
server.on('checkContinue',function(req,res){});

/**
 * 说明：如果客户端发起connect请求，如果服务器端没有监听，那么于客户端请求的该连接将会被关闭
 * @param {Object} req 是该HTTP请求的参数，与request事件中的相同。
 * @param {Object} socket 是服务端与客户端之间的网络套接字。需要自己写一个data事件监听数据流
 * @param {Object} head 是一个Buffer实例，隧道流的第一个包，该参数可能为空。
 */
server.on('connect',function(req,socket,head){});

/**
 * 说明：这个事件主要是对HTTP协议升级为其他协议后的事件监听，如果服务器端没有监听，那么于客户端请求的该连接将会被关闭
 * @param {Object} req 是该HTTP请求的参数，与request事件中的相同。
 * @param {Object} socket 是服务端与客户端之间的网络套接字。需要自己写一个data事件监听数据流
 * @param {Object} head 是一个Buffer实例，升级后流的第一个包，该参数可能为空。
 */
server.on('upgrade',function(req,socket,head){});

/**
 * 说明：如果一个客户端连接触发了一个 'error' 事件, 它就会转发到这里
 * @param {Object} exception
 * @param {Object} socket
 */
server.on('clientError',function(exception,socket){});

/**
 * 源API：server.listen(port, [hostname], [backlog], [callback])
 * 说明：监听一个 unix socket, 需要提供一个文件名而不是端口号和主机名。
 * @param {Number} port 端口
 * @param {String} host 主机
 * @param {Number} backlog 等待队列的最大长度，决定于操作系统平台，默认是511
 * @param {Function} callback 异步回调函数
 */
//server.listen(3000,'localhost',100,function(){});

/**
 * 源API：server.listen(path, [callback])
 * 说明：启动一个 UNIX 套接字服务器在所给路径 path 上监听连接。
 * 可能用处：多路径或渠道数据来源监听分隔
 * @param {String} path
 * @param {Function} callback
 */
//server.listen('path',function(){})

/**
 * 源API：server.listen(handle, [callback])
 * 说明：Windows 不支持监听一个文件描述符。
 * @param {Object} handle 变量可以被设置为server 或者 socket
 * @param {Function} callback
 */
//server.listen({},function(){});

/**
 * 说明：最大请求头数目限制, 默认 1000 个. 如果设置为0, 则代表不做任何限制.
 * @type {number}
 */
server.maxHeadersCount = 1000;

/**
 * 源API：server.setTimeout(msecs, callback)
 * 说明：为套接字设定超时值。如果一个超时发生，那么Server对象上会分发一个'timeout'事件，同时将套接字作为参数传递。
 * 设置为0将阻止之后建立的连接的一切自动超时行为
 * @param {Number} msecs
 * @param
 */
server.setTimeout(1000,function(){});

/**
 * 说明：一个套接字被判断为超时之前的闲置毫秒数。 默认 120000 (2 分钟)
 * @type {number}
 */
server.timeout = 120000;

/**
 * 说明：这里的主机将是本地
 * @param {Number} port 端口
 * @param {Function} callback 异步回调函数
 */
server.listen(8124,function(){
   console.log('Listen port 8124');
});

